package com.personal.portal.admin.controller;

import com.personal.portal.common.entity.Result;
import com.personal.portal.admin.entity.User;
import com.personal.portal.admin.entity.dto.PersonalProfileVO;
import com.personal.portal.admin.service.PersonalProfileService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 个人信息控制器
 *
 * @author zhanghui
 * @version 1.0.0
 * @since 2025-11-13
 */
@Tag(name = "个人信息", description = "个人信息管理接口")
@RestController
@RequestMapping("/admin/personal-profile")
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class PersonalProfileController {

    @Resource
    private PersonalProfileService personalProfileService;

    /**
     * 根据ID查询个人信息
     */
    @Operation(summary = "根据ID查询个人信息", description = "根据个人信息ID查询详细信息")
    @GetMapping("/{id}")
    public Result<PersonalProfileVO> queryById(
            @Parameter(description = "个人信息ID", required = true)
            @PathVariable Long id) {
        try {
            User profile = personalProfileService.queryById(id);
            if (profile != null) {
                PersonalProfileVO vo = PersonalProfileVO.fromProfile(profile);
                return Result.success(vo);
            } else {
                return Result.error("个人信息不存在");
            }
        } catch (Exception e) {
            return Result.error("查询个人信息失败: " + e.getMessage());
        }
    }

    /**
     * 根据条件查询个人信息列表
     */
    @Operation(summary = "根据条件查询个人信息列表", description = "根据姓名、职位等条件查询个人信息")
    @PostMapping("/list")
    public Result<List<PersonalProfileVO>> queryList(
            @Parameter(description = "个人信息查询条件")
            @RequestBody User personalProfile) {
        try {
            List<User> profiles = personalProfileService.queryList(personalProfile);
            List<PersonalProfileVO> vos = profiles.stream()
                .map(PersonalProfileVO::fromProfile)
                .collect(Collectors.toList());
            return Result.success(vos);
        } catch (Exception e) {
            return Result.error("查询个人信息列表失败: " + e.getMessage());
        }
    }

    /**
     * 分页查询个人信息
     */
    @Operation(summary = "分页查询个人信息", description = "支持分页和条件查询的个人信息")
    @PostMapping("/page")
    public Result<Result.PageResult<PersonalProfileVO>> queryPage(
            @Parameter(description = "页码，从1开始", example = "1")
            @RequestParam(defaultValue = "1") int pageNum,
            @Parameter(description = "每页数量", example = "10")
            @RequestParam(defaultValue = "10") int pageSize,
            @Parameter(description = "个人信息查询条件")
            @RequestBody User personalProfile) {
        try {
            Result.PageResult<User> pageResult = personalProfileService.queryPage(pageNum, pageSize, personalProfile);
            List<PersonalProfileVO> vos = pageResult.getData().stream()
                .map(PersonalProfileVO::fromProfile)
                .collect(Collectors.toList());
            Result.PageResult<PersonalProfileVO> voResult = new Result.PageResult<>(
                vos, pageResult.getTotal(), pageResult.getPageNum(), pageResult.getPageSize()
            );
            return Result.success(voResult);
        } catch (Exception e) {
            return Result.error("分页查询个人信息失败: " + e.getMessage());
        }
    }

    /**
     * 创建个人信息
     */
    @Operation(summary = "创建个人信息", description = "新增一条个人信息")
    @PostMapping
    public Result<Long> create(
            @Parameter(description = "个人信息", required = true)
            @RequestBody User personalProfile) {
        try {
            int result = personalProfileService.insert(personalProfile);
            if (result > 0) {
                return Result.success("创建个人信息成功", personalProfile.getId());
            } else {
                return Result.error("创建个人信息失败");
            }
        } catch (Exception e) {
            return Result.error("创建个人信息失败: " + e.getMessage());
        }
    }

    /**
     * 更新个人信息
     */
    @Operation(summary = "更新个人信息", description = "更新指定ID的个人信息")
    @PutMapping("/{id}")
    public Result<Long> update(
            @Parameter(description = "个人信息ID", required = true)
            @PathVariable Long id,
            @Parameter(description = "个人信息", required = true)
            @RequestBody User personalProfile) {
        try {
            personalProfile.setId(id);
            int result = personalProfileService.update(personalProfile);
            if (result > 0) {
                return Result.success("更新个人信息成功", id);
            } else {
                return Result.error("更新个人信息失败");
            }
        } catch (Exception e) {
            return Result.error("更新个人信息失败: " + e.getMessage());
        }
    }

    /**
     * 删除个人信息
     */
    @Operation(summary = "删除个人信息", description = "根据ID删除指定的个人信息")
    @DeleteMapping("/{id}")
    public Result<Long> delete(
            @Parameter(description = "个人信息ID", required = true)
            @PathVariable Long id) {
        try {
            int result = personalProfileService.deleteById(id);
            if (result > 0) {
                return Result.success("删除个人信息成功", id);
            } else {
                return Result.error("删除个人信息失败");
            }
        } catch (Exception e) {
            return Result.error("删除个人信息失败: " + e.getMessage());
        }
    }

    /**
     * 批量删除个人信息
     */
    @Operation(summary = "批量删除个人信息", description = "根据ID列表批量删除个人信息")
    @DeleteMapping("/batch")
    public Result<List<Long>> deleteBatch(
            @Parameter(description = "个人信息ID列表", required = true)
            @RequestBody List<Long> ids) {
        try {
            List<Long> successIds = personalProfileService.deleteBatch(ids);
            return Result.success(
                String.format("成功删除 %d 条记录", successIds.size()), successIds);
        } catch (Exception e) {
            return Result.error("批量删除个人信息失败: " + e.getMessage());
        }
    }

    /**
     * 获取公开的个人信息（用于前端展示）
     */
    @Operation(summary = "获取公开的个人信息", description = "获取公开显示的个人信息，用于前端展示")
    @GetMapping("/public")
    public Result<PersonalProfileVO> getPublicProfile() {
        try {
            User profile = personalProfileService.getPublicProfile();
            if (profile != null) {
                PersonalProfileVO vo = PersonalProfileVO.fromProfile(profile);
                return Result.success(vo);
            } else {
                return Result.error("未找到公开的个人信息");
            }
        } catch (Exception e) {
            return Result.error("获取公开个人信息失败: " + e.getMessage());
        }
    }
}
